{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Accelerator / Deflector Demo\n",
    "\n",
    "In this notebook we will optimize a laser-driven electron deflecting structure.\n",
    "\n",
    "In this problem, we'll have an electron flowing in the y direction through the center of our domain.\n",
    "\n",
    "We have a laser source coming in from the left which we will use to deflect the electron in the out of plane direction.\n",
    "\n",
    "We'll optimize the regions around the electron trajectory to maximize this deflection, while leaving a central gap for the electron to flow through."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "#\n",
    "#                ______  e-   ______\n",
    "#                ||||||   ^   ||||||        \n",
    "# driving laser  ||||||   |   ||||||        \n",
    "# -------------> ||||||   |   ||||||        \n",
    "#                ||||||   |   ||||||   \n",
    "#                ||||||   |   ||||||        \n",
    "#                ------       ------\n",
    "#                design       design\n",
    "#                region       region\n",
    "#"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pylab as plt\n",
    "import scipy.sparse as sp\n",
    "import sys\n",
    "sys.path.append('..')\n",
    "\n",
    "from angler import Optimization, Simulation\n",
    "from angler.structures import accelerator\n",
    "\n",
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# fundamental constants and simulation parameters\n",
    "c0 = 3e8                     # speed of light in vacuum (m/s)\n",
    "lambda_m = 2e-6              # waveength in meters\n",
    "omega = 2*np.pi*c0/lambda_m  # angular frequency (2pi/s)\n",
    "dl = 0.5e-1                  # grid size (microns)\n",
    "NPML = [15, 0]               # number of pml grid points on x and y borders\n",
    "pol = 'Hz'                   # polarization (either 'Hz' or 'Ez')\n",
    "num_cells = 5                # number of cells to tile in plots"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# material constants\n",
    "n_index = np.sqrt(2)               # refractive index\n",
    "eps_m = n_index**2           # relative permittivity"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# geometric parameters\n",
    "beta = 0.5                  # electron speed / speed of light\n",
    "gap = 0.4                   # gap size (microns)\n",
    "lambda0 = lambda_m*1e6      # free space wavelength (microns)\n",
    "L = 5                       # width of design region (microns)\n",
    "spc = 2                     # space between PML -> Src. & Src -> Design region"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Computed a domain with 397 grids in x and 20 grids in y\n",
      "The simulation has 40 grids per free space wavelength\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbgAAAEoCAYAAAAqrOTwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAElZJREFUeJzt3XusZWV5x/HvbxCDKIgy2ipgxxqUeoGKGLWQOHjjUhpTtSoSDbSircRqtKmXGonRxFgvUTSKo46oVUQrrdqKl9pSbBTbGYqAlxgCQVEsDqZAsUqBp3/sPXELc86sM2efM7Oe8/0kO+esvda79rv3P7887/uutVJVSJLUzbrd3QFJklaCASdJasmAkyS1ZMBJkloy4CRJLRlwkqSWDDhJ0lwkOSTJvyT5TpJvJ3nZDo5JkrOSXJnksiRHrlR/7rZSJ5YkrTm3Aa+sqkuS7AdsTfKVqvrOzDEnAIdOX48D3jf9O3dWcJKkuaiq66rqkun/NwPfBQ6602FPBz5aExcDByR5wEr0x4CTJM1dkg3Ao4Fv3mnXQcAPZ7av5a4hOBcOUUpSU0nmfS/GbwO/mNneVFWbdvC59wI+A7y8qm6acx8GM+AkqbEkcztXVf2iqo7ayeftzSTcPl5V5+/gkB8Bh8xsHzx9b+4copSkxpLM7TXgswJ8CPhuVb1jgcM+B7xgupry8cCNVXXd/L7xr1jBSVJj86zgBjgaeD5weZJLp++9FngQQFWdDXwBOBG4Evg5cNpKdSY+LkeSekpSe+2119zOd/vtt2/d2RDlnsQKTpKaSsK6dfObibr99tvndq7VYMBJUmOrPES5RzHgJKkxA06S1JIBJ0lqyYCTJLUz9Pq1rgw4SWpsnqsox8aAk6TGrOAkSS0ZcJKkdpyDkyS1ZcBJkloy4CRJLbmKUpLUjnNwkqS2DDhJUktrOeDW7uCsJKk1KzhJamwtV3AGnCQ1ZsBJktpJ4mUCkqSerOAkSS0ZcJKklgw4SVI73slEktSWASdJaslVlJKklqzgJEntOAcnSWrLgJMktWTASZJacpGJJKkd5+AkSW2t5YBbu7WrJKk1KzhJasw5OElSS2t5iNKAk6SmfOCpJKktKzhJUksGnCSpHYcoJUltWcFJklqygpMktWQFJ0lqxzk4SVJbVnCSpJbWcsCt3dpVkprbPkQ5r9eAz9uc5PokVyyw/95JPp/kW0m+neS0uX/pGQacJDW2/Zlw83gNcA5w/CL7zwC+U1VHABuBtye5+7K/5AIcopSkxlZzkUlVXZRkw2KHAPtlkpb3An4G3LZS/THgJKmxOc/BrU+yZWZ7U1VtWkL79wCfA34M7Ac8p6rumGcHZxlwkqShtlXVUctofxxwKfAk4CHAV5J8rapumkvv7sQ5OElqap7zb3OqBE8Dzq+JK4GrgcPmceIdsYKTpMb2sAu9fwA8Gfhakt8AHgZctVIfZsBJUmOreR1cknOZrI5cn+Ra4Exgb4CqOht4I3BOksuBAK+qqm0r1R8DTpKaWu1bdVXVyTvZ/2PgaavUHQNOkjpby3cyMeAkqTEDTpLU0h62yGRVGXCS1NQcl/ePkgEnSY1ZwUmSWrKCkyS14xO9JUltWcFJkloy4CRJLRlwkqR2vExAktTWWg64tbu8RpLUmhWcJDW2lis4A06SGjPgJEktGXCSpHa8k4kkqS0rOElSSwacJKklA06S1I53MpEktWXASZJaMuAkSS0ZcJKklgw4SVI7LjKRJLVlwEmSWlrLAbd2b1ImSWvA9mHKebx2Q9+3JjkjyX12pb0BJ0naUz0HeCDwH0k+meS4LCFpDThJamzMFVxVXVlVfwU8FPgEsBm4Jskbktx3Z+2dg5OkpjqsokxyOHAacCLwGeDjwDHAPwO/u1jbJQXc+vXra8OGDbvWS/2arVu37u4utPSYxzxmwX3+5itjsd9cS7N169ZtVXW/eZ5zzAGXZCvw38CHgFdX1S+nu76Z5OidtV9SwG3YsIEtW7YsvZe6i1NPPZWPfOQju7sb7bztbW9j48aNO9znb74yFvvNtTRJrlmBc877lKvpj6rqqtk3kjy4qq6uqmfsrLFzcLuJlfDKuPDCCxfc52++Mhb7zbX7jXkODvjbge/tkHNwktTYGCu4JIcBjwDunWS2Utsf2GfoeQw4SWpqxItMHgacBBwA/MHM+zcDpw89iQEnSY2NMeCq6rPAZ5M8oaq+savnMeAkqbExBlySv6yqvwael+TkO++vqj8fch4DTpIaG2PAAd+d/l3Wsn0DTpIaG2PAVdXnp/9eXlWX7Op5DDhJamrEi0y2e3uS32RyacB5VXXFUhp7HZwkNTbm6+Cq6ljgWOCnwPuTXJ7kdUPbG3CS1Ni6devm9todquonVXUW8KfApcDrh7Z1iFKSGhvzEGWS32HyyJxnAjcA5wGvHNregJOkplZ7aDHJZiYXaF9fVY9c4JiNwDuBvYFtVfXERU65mUmoHVdVP15qfww4SdK8nAO8B/jojnYmOQB4L3B8Vf0gyf0XO1lVPWE5nTHgJKmx1azgquqiJBsWOeR5wPlV9YPp8dfv6KAkn6qqZye5HKjZXZNmdfiQ/hhwktTYHjYH91Bg7yQXAvsB76qqHVV7L5v+PWk5H2bASVJjcw649Ulm7y6yqao2LaH93YDHAE8G7gF8I8nFVfX92YOq6rrpvy+pqlfN7kvyFuDX3lvswyRJTc054LZV1VHLaH8tcENV3QLckuQi4Ajg+wsc/1TuGmYn7OC9HfI6OElqap4Xec8pKD8LHJPkbkn2BR7Hr+47OdvvP5vOvx2W5LKZ19XA5UM/zApOkhpb5csEzgU2MhnKvBY4k8nlAFTV2VX13SRfBC4D7gA+uMDttz4BXAC8GXj1zPs3V9XPhvbHgJOkxlZ5FeVdHm2zg2PeCrx1J8fcCNyY5LaqumZ2X5KPVdXzh/THgJOkxvawVZRL9YjZjSTbF6kMYsBJUlNJdts9JJcjyWuA1wL3SHLT9reBW4HBqzYNOElqbIwVXFW9GXhzkjdX1Wt29TwGnCQ1NsaAS3JYVX0P+HSSI++8f+hDUA04SWpsjAEHvAJ4EfD2Hewr4ElDTmLASVJjYwy4qnrR9O+xyzmPASdJTe2uJ3HPS5K9gN8HNjCTV1X1jiHtDThJamzMAQd8HvgFk7uX3LHUxgacJDU28oA7eOijcXZkfBdISJLWiguSPG1XG1vBSVJjI6/gLgb+Lsk64P/41QNP9x/S2ICTpMZGHnDvAJ4AXF5VtbOD78yAk6Smxnqrrhk/BK7YlXADA06SWht5BXcVcGGSC4Bfbn/TywQkSWMPuKunr7tPX0tiwElSY2MNuOlF3vtV1V/s6jkMOElqasx3Mqmq25McvZxzGHCS1NhYA27q0iSfAz4N3LL9zao6f0hjA06SGht5wO0D3MCvPz2gAANOkta6MQdcVZ22nPajvkBCkrS47fNw83jthr4/NMlXk1wx3T48yeuGtjfgJKmpeYbbbqoEPwC8hsltuqiqy4DnDm3sEKUkNTbyO5nsW1X/fqdwvW1oYwNOkhob8xwcsC3JQ5gsLCHJs4DrhjY24CSpsZEH3BnAJuCwJD9icleTU4Y2NuAkqakxX+gNUFVXAU9Jck9gXVXdvJT2ox6clST1leTAJGcBX2Ny0+V3JTlwaHsrOElqbOSLTD4JXAQ8c7p9CnAe8JQhjQ04SWpszEOUwAOq6o0z229K8pyhjUcd7ZKkxY38OrgvJ3luknXT17OBLw1tbAUnSU2NfZEJcDrwcuBj0+29gFuSvBioqtp/scYGnCQ1NuaAq6r9ltPegJOkxka+yGRZDDhJaqrBEOWyGHCS1JgBJ0lqaewBl+QY4NCq+nCS+wH3qqqrh7Q14CSpsTHPwSU5EzgKeBjwYWBv4G+Ao4e0N+AkqakGc3B/CDwauASgqn6cZPDKSgNOkhobecDdWlWVZPvjcu65lMYGnCQ1NvKA+1SS9wMHJDkd+GMmT/kexICTpMbGHHBV9bYkTwVuYjIP9/qq+srQ9gacJDWVZOyLTF4BnLeUUJtlwElSY2Ou4ID9mNxw+WdMHpPz6ar6r6GNxxvtkqTWquoNVfUI4AzgAcC/Jvmnoe2t4CSpsZFXcNtdD/wEuAG4/9BGVnCS1NhqPg8uyeYk1ye5YifHPTbJbUmetZPjXpLkQuCrwIHA6VV1+NDvbgUnSU3thkUm5wDvAT660AFJ9gLeAnx5wPkOAV5eVZfuSmcMOElqbDWHKKvqoiQbdnLYS4HPAI9d6IAk+1fVTcBbp9v3vdPn/GxIfww4SWpsT5qDS3IQk9tvHcsiAQd8AjgJ2AoUMPslCvjtIZ9nwElSY3MOuPVJtsxsb6qqTUto/07gVVV1x2L9qqqTpn8fvGvdnDDgJKmxOQfctqo6ahntjwI+Oe3TeuDEJLdV1d/v6OAkX62qJ+/svYUYcJLU1J52J5PZiizJOcA/7CjckuwD7MukYrwPvxqi3B84aOjnGXCS1NhqzsElORfYyCSYrgXOZPIMN6rq7CWc6sXAy4EHMpmH2/4lbmKySnMQA06SGlvlVZQnL+HYUxfZ9y7gXUleWlXv3tX+GHCS1NietIpyqarq3UkeCTwc2Gfm/QWvs5tlwElSU3vaHNxSJTmTyZDnw4EvACcA/8YiF5LPGu83lyTt1GreqmsFPAt4MvCTqjoNOAK499DGBpwkaU/1v1V1B3Bbkv2Z3HT5kKGNHaKUpMbGPAcHbElyAPABJqsp/wf4xtDGBpwkNTbmgKuql0z/PTvJF4H9q+qyoe0NOEnSHiXJkYvtq6pLhpzHgJOkpnbj4pDlevsi+wp40pCTGHCS1NgYA66qjp3HeVxFKUmNjfkygST7Jnldkk3T7UOTnDS0vQEnSY2NOeCADwO3Ar833f4R8KahjVNVgz8pyU+Ba5bSO0nSYL9VVfeb18kOO+yw2rx587xOx9FHH711mY/LWZIkW6rqqCT/WVWPnr73rao6Ykj7Jc3BzfOHlyRpJ25Ncg8mC0tI8hDgl0Mbu8hEkpoa8SrK7c4EvggckuTjwNHAqUMbG3CS1NhYAy6Tjn8PeAbweCbPhHtZVW0beg4DTpIaG2vAVVUl+UJVPQr4x105h6soJamxka+ivCTJY3e1sRWcJDU21gpu6nHAKUmuAW5hMkxZVXX4kMYGnCQ11WCRyXHLaWzASVJjYw64qlrWddfOwUmSWrKCk6TGxlzBLZcBJ0mNreWAc4hSktSSFZwkNbaWKzgDTpKaanCZwLIYcJLUmAEnSWrJgJMktWTASZJaWssB52UCkqSWrOAkqSlXUUqS2jLgJEktGXCSpJYMOElSSwacJKmdtb7IxMsEJEktWcFJUmNruYIz4CSpsbUccA5RSpJaMuAkSS05RClJja3lIUoDTpIaM+AkSe14HZwkSQ0ZcJLU2PYqbh6vAZ+1Ocn1Sa5YYP8pSS5LcnmSryc5Yu5feIYBJ0mNrWbAAecAxy+y/2rgiVX1KOCNwKblf8OFOQcnSZqLqrooyYZF9n99ZvNi4OCV7I8BJ0mNzXmRyfokW2a2N1XVrlZhfwJcMIc+LciAk6TG5hxw26rqqOWeJMmxTALumOV3aWEGnCQ1tSdeJpDkcOCDwAlVdcNKfpaLTCRJqyLJg4DzgedX1fdX+vOs4CSpsdWs4JKcC2xkMld3LXAmsDdAVZ0NvB44EHjvtF+3zWPIcyEGnCQ1tpoBV1Un72T/C4EXrlJ3DDhJ6mxPm4NbTc7BSZJaMuAkSS05RClJja3lIUoDTpKa2hOvg1tNDlFKklqygpOkxtZyBWfASVJjBpwkqaW1HHDOwUmSWrKCk6TG1nIFZ8BJUlNeJiBJUkNWcJLU2Fqu4Aw4SWpsLQecQ5SSpJas4CSpMSs4SZKasYKTpKa8TECSpIYMOElSSw5RSlJjDlFKktSMFZwkNWYFJ0lSM1ZwktSYFZwkSc1YwUlSY1ZwkiQ1YwUnSU15qy5Jkhoy4CRJLTlEKUmNOUQpSVIzVnCS1JgVnCRJzRhwkqSWHKKUpMYcopQkqRkrOElqzApOkqRmrOAkqSnvRSlJUkNWcJLUmBWcJEnNGHCS1Nj2ebh5vAZ81uYk1ye5YoH9SXJWkiuTXJbkyLl/4RkGnCRpXs4Bjl9k/wnAodPXi4D3rWRnnIOTpMZWcw6uqi5KsmGRQ54OfLSqCrg4yQFJHlBV161Ef6zgJEmr5SDghzPb107fWxFWcJLU1NatW7+UZP0cT7lPki0z25uqatMczz9XBpwkNVVVi82H7Q4/Ag6Z2T54+t6KcIhSkrRaPge8YLqa8vHAjSs1/wZWcJKkOUlyLrARWJ/kWuBMYG+Aqjob+AJwInAl8HPgtBXtz2QxiyRJvThEKUlqyYCTJLVkwEmSWjLgJEktGXCSpJYMOElSSwacJKklA06S1NL/A5n12LbramXVAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# define permittivity of three port system\n",
    "eps_r, design_region = accelerator(beta, gap, lambda0, L, spc, dl, NPML, eps_m)\n",
    "(Nx, Ny) = eps_r.shape\n",
    "nx, ny = int(Nx/2), int(Ny/2)\n",
    "\n",
    "# make a new simulation\n",
    "simulation = Simulation(omega,eps_r,dl,NPML,pol)\n",
    "\n",
    "print(\"Computed a domain with {} grids in x and {} grids in y\".format(Nx,Ny))\n",
    "print(\"The simulation has {} grids per free space wavelength\".format(int(lambda0/dl)))\n",
    "\n",
    "simulation.plt_eps(tiled_y=num_cells)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# set the plane wave source\n",
    "simulation = Simulation(omega, eps_r, dl, NPML, 'Hz')\n",
    "simulation.src = np.zeros((Nx, Ny))\n",
    "simulation.src[NPML[0] + int(spc/dl), :] = 1e-9"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "E0 = 2.507588729072768e-11\n"
     ]
    }
   ],
   "source": [
    "# make an empty space simulation for normalization of fields\n",
    "eps_normalize, _ = accelerator(beta, gap, lambda0, L, spc, dl, NPML, 1)\n",
    "sim_normalize = Simulation(omega,eps_normalize,dl,NPML,pol)\n",
    "sim_normalize.src = np.zeros((Nx, Ny))\n",
    "sim_normalize.src[NPML[0] + int(spc/dl), :] = 1e-9\n",
    "\n",
    "(_,Ey,Hz) = sim_normalize.solve_fields()\n",
    "sim_normalize.plt_re(tiled_y=num_cells, outline=False)\n",
    "plt.show()\n",
    "E0 = np.mean(np.abs(Ey[nx, :]))\n",
    "print('E0 = {}'.format(E0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/anaconda3/lib/python3.6/site-packages/matplotlib/contour.py:1173: UserWarning: No contour levels were found within the data range.\n",
      "  warnings.warn(\"No contour levels were found\"\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# initalize the design region randomly\n",
    "simulation.init_design_region(design_region, eps_m, style='halfway')\n",
    "simulation.plt_eps(tiled_y=num_cells)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# define objective function  (equal power transmission to bottom and top)\n",
    "from angler.objective import Objective, obj_arg\n",
    "arg1 = obj_arg('ey', component='Ey', nl=False)\n",
    "\n",
    "import autograd.numpy as npa\n",
    "def J(ey):\n",
    "    eta = npa.zeros((Nx, Ny), dtype=npa.complex128)\n",
    "    eta[nx, :] = 1/Ny*npa.exp(1j*2*npa.pi*dl*npa.linspace(0, Ny-1, Ny)/beta/lambda0)\n",
    "    return npa.sum(npa.real(ey*eta)) / E0\n",
    "\n",
    "objective = Objective(J, arg_list=[arg1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# make optimization object and check derivatives\n",
    "R = None\n",
    "beta_proj = 1e-9\n",
    "eta= 0.5\n",
    "optimization = Optimization(objective=objective, simulation=simulation, design_region=design_region, eps_m=eps_m, R=R, beta=beta_proj, eta=eta)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "adjoint gradient   = [-9.1828978248856e-05, -3.8700130361114744e-05, 6.79375511461348e-05, -2.0656322608552746e-05, 3.359535183863455e-05]\n",
      "numerical gradient = [-9.784591475242577e-05, -3.2033043217971624e-05, 4.1445602470824294e-05, 1.1829320599454629e-05, 4.381603611880447e-05]\n"
     ]
    }
   ],
   "source": [
    "# check the derivatives (note, full derivatives are checked, linear and nonlinear no longer separate)\n",
    "(grad_avm, grad_num) = optimization.check_deriv(Npts=5, d_rho=1e-3)\n",
    "print('adjoint gradient   = {}\\nnumerical gradient = {}'.format(grad_avm, grad_num))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " ObjectiveFn:  0.463 Iteration:  998/1000 ETA:   0:00:00                       "
     ]
    }
   ],
   "source": [
    "# run the optimization\n",
    "optimization.run(method='lbfgs', Nsteps=1000, step_size=2e-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1584x216 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot optimization results\n",
    "f, (ax1, ax2) = plt.subplots(1, 2, figsize=(22,3))\n",
    "\n",
    "simulation.plt_eps(ax=ax1, tiled_y=num_cells, outline=False)\n",
    "ax1.set_title('final permittivity distribution')\n",
    "\n",
    "optimization.plt_objs(ax=ax2)\n",
    "ax2.set_yscale('linear')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/anaconda3/lib/python3.6/site-packages/matplotlib/contour.py:1173: UserWarning: No contour levels were found within the data range.\n",
      "  warnings.warn(\"No contour levels were found\"\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/cAAAEsCAYAAACG4EMKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3XecG+d95/HPMzMAFthCLntvorpESpbkpi5Ltiw3uVtOHMc1ySX2OefcxbHjuF56cr4U++xYck1kO5ZtOe62uqhKSRRVKEoiRVGi2LmFyy0AZp77Y2aAARYLYpcLLrH8vl+veQ0wGMw8GOxi5pnf8/weY61FRERERERERFqXM9UFEBEREREREZEjo8q9iIiIiIiISItT5V5ERERERESkxalyLyIiIiIiItLiVLkXERERERERaXGq3IuIiIiIiIi0OFXuRURERERE5JhljLnOGLPHGPPoJG3vF8aYXmPMT6qWX2uMedgYs9EY831jTMdk7O9oUeVeREREREREjmVfB66cxO39HfCuGsv/2Fq71lq7BtgO/NEk7rPpVLkXERERERGRY5a19nbgQHKZMeaEKAL/gDHmDmPMKePY3k3AwRrL+6NtGyAL2CMr+dGlyr2IiIiIiIi0mq8AH7LWngP8CfDFydioMeZrwC7gFOCfJ2ObR4s31QUQERERERERaVTUF/7lwH+GQXYAMtFrbwI+W+NtO6y1rzrctq217zHGuIQV+7cDX5uUQh8FqtyLiIiIiIhIK3GAXmvtWdUvWGt/APzgSDZurfWNMd8B/hctVLlXs3wRERERERFpGVHf+GeMMW+FsI+8MWbtkWwz2sbq+DHweuCJIy7sUWSsbakcASIiIiIiInIcMcZcD1wCzAF2A58Cbga+BCwEUsB3rLW1muPX2t4dhH3qO4D9wPuAXwN3AF2AAR4G/iBOstcKVLkXERERERERaXFqli8iIiIiIiLS4lS5FxEREREREWlxypYvIiIiIiIi057TtcRSHB73++zQ/l9aa69sQpEmlSr3IiIiIiIiMv35I6ROfeO435Z/8KtzmlCaSafKvYiIiIiIiBwXjONOdRGaRpV7EREREREROQ4YVe5FREREREREWppR5V5ERERERESkpRnAuKrci4iIiIiIiLQuY3AUuRcRERERERFpbWqWLyIiIiIi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IKDdSeB6Pn6UFB8/Vko1BfVah3v5yvvP5xv3beKTyxNlj51rffwjRyo+t4iIyNHCUr7lbS0YY1Zaa7dFf/4OsLlW19LkXqROLjpz1cSed9aaio+98LxzJ3SNapxy5jkVH3vWuefXcCShC1bMq/o5F521tgYjCbUev4ae8Q8boZr3dKJWZYaqOv6c1l68hcfXZCx3PT8MDOeqwhe6f+8c7B7orO43hYr179pD/7fvrPp5i+55JFznv3pu7r5LuuCd8+fRvepkABInrIH0INW902N7aMuhKTpTaa3DvXxyqQPjZGesfn5T7SoBFThlXfX/HSSXnV6DkYTesq76/2efv2w2UNuiCmvOPq/iY0884801HEnoojNXV37s2pOn5JrnnFf7zxYRaR4TjNxPxn83xpxM2JDnFWpUKR/A2CpenDFmXzQgERERERERaT7LrLVzxz+s8axIpOzfdC+v+nkf2v/Ck+XS8o8WVUXum/UfWURERERERKSRKS1fREREREREmp4dpztOo9PkXkRERERERI4JzdytVZN7ERERERERaXoWq8i9iIiIiIiISCOrRyu86aTJvYiIiIiIiBwTNLkXERERERERaWAqqCciIiIiIiLSBBS5FxEREREREWlg4Zr75p3da3IvIiIiIiIiTU8F9URERERERESagCL3IiIiIiIiIg0sLKhX71HUjib3IiIiIiIickxQ5F5ERERERESkgVkgqPcgakiTexERERERETkGWEXuRURERERERBqZquWLiIiIiIiINDj1uRcRERERERFpdE1eLd+p9wBEREREREREZHIUuRcREREREZGmp7R8ERERERERkSbQzGn5mtyLiIiIiIhI02v2yL2xTfziRERERERERACMMT8H5kzgqfuttZdO9Ximmib3IiIiIiIiIg1O1fJFREREREREGpwm9yIiIiIiIiINTpN7ERERERERkQanyb2IiIiIiIhIg9PkXkRERERERKTBaXIvIiIiIiIi0uA0uRcRERERERFpcJrci4iIiIiIiDQ4Te5FREREREREGtz/B0CZpxt0IyY2AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 1440x360 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# setup subplots\n",
    "f, (ax) = plt.subplots(1,1, figsize=(20,5))\n",
    "\n",
    "# linear fields\n",
    "(Hx,Hy,Ez) = simulation.solve_fields()\n",
    "simulation.plt_re(ax=ax, tiled_y=num_cells)\n",
    "ax1.set_title('linear field')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "for more info see\n",
    "\n",
    "**Hughes, Tyler, et al. \"Method for computationally efficient design of dielectric laser accelerator structures.\" Optics Express 25.13 (2017): 15414-15427**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
